//这个文件就是我们对axios进行二次封装的文件
//因为axios本身的功能不能满足我们的需求

// 配置基础路径和超时限制

// 添加进度条信息  nprogress

// 返回的响应后期不再需要从data属性当中拿数据，而是响应就是我们要的数据

// 统一处理请求错误, 具体请求也可以选择后期处理或不处理

import axios from 'axios'
import Nprogress from 'nprogress'  //引入js
import 'nprogress/nprogress.css' // 引入css



const service = axios.create({
  baseURL:'/api', //这里是配置接口公共的路径部分
  timeout:'20000' //配置超时时间
}) //这个方法会返回一个新的axios实例，功能和原本的axios功能一样


//请求拦截器和响应拦截器是用来让我们配置头和添加额外的功能用的
//请求拦截器 拦截的是请求报文
service.interceptors.request.use(
  (config) => {
    //开启进度条
    Nprogress.start()
    return config
  },
  // 请求拦截器的失败回调，一般不写
  // (err) => {
  //   alert('')
  // }
);

//响应拦截器 拦截的是响应报文
service.interceptors.response.use(
  (response) => {
    Nprogress.done() //关闭进度条
    return response.data  //以后请求返回的响应不是真正的响应，而是响应里面的数据
  },
  (error) => {
    Nprogress.done() //关闭进度条
    //可以统一处理错误
    alert('请求失败' + error.message || '未知错误')
    
    //统一处理完失败，错误之后，你可以继续让后面再次处理，也可以选择不处理
    return new Promise(() => {}) //中断promise链，代表这个错误后面就不用处理了
    // return Promise.reject(new Error('请求失败'))  
    //代表错误可以继续往后传递，后面axios返回的promise可以继续处理
  }
);

//把封装好的axios实例暴露出去，以后我们请求使用的就是这个封装好的axios实例
export default service


